/* eslint-disable no-useless-escape */
// 验证相关的辅助方法

// 验证是否为数字
export const isNumber = (value: string | number): boolean => {
  const val = `${value}`;
  if (!val) {
    return false;
  }
  let isNegative = false;
  const num0 = val[0].charCodeAt(0);
  if (num0 === 45) {
    isNegative = true;
  } else if (!(num0 >= 48 && num0 <= 57)) {
    return false;
  }

  let isNumber = true;
  let pointTimes = 0;
  for (let i = isNegative ? 1 : 0; i < val.length; i++) {
    const code = val[i].charCodeAt(0);
    if (code === 46 && i !== val.length - 1) {
      pointTimes += 1;
      if (pointTimes > 1) {
        break;
      }
    } else if (code < 48 || code > 57) {
      isNumber = false;
      break;
    }
  }

  if (pointTimes > 1) {
    return false;
  }

  return isNumber;
};

// 验收是否是手机号码
export const isPhoneNumber = (str: string | number): boolean => {
  const number = str + '';
  const reg = /^1[3456789]\d{9}$/;
  if (reg.test(number)) {
    return true;
  } else {
    return false;
  }
};

// 验证是否为邮箱
export const validataEmail = (str: string) => {
  if (!str) {
    return false;
  }
  return /^\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w+$/.test(str);
};

// 验证身份证号码格式
export function checkIdcard(personnumber: string) {
  personnumber = personnumber.toUpperCase();
  //身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X。
  if (!/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(personnumber)) {
    return false;
  }
  //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
  //下面分别分析出生日期和校验位
  var len, re;
  len = personnumber.length;
  if (len == 15) {
    re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
    var arrSplit = personnumber.match(re);

    //检查生日日期是否正确
    var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
    var bGoodDay;
    bGoodDay =
      dtmBirth.getFullYear() == Number(arrSplit[2]) &&
      dtmBirth.getMonth() + 1 == Number(arrSplit[3]) &&
      dtmBirth.getDate() == Number(arrSplit[4]);
    if (!bGoodDay) {
      return false;
    } else {
      //将15位身份证转成18位
      //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
      var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
      var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
      var nTemp = 0,
        i;
      personnumber = personnumber.substr(0, 6) + '19' + personnumber.substr(6, personnumber.length - 6);
      for (i = 0; i < 17; i++) {
        nTemp += personnumber.substr(i, 1) * arrInt[i];
      }
      personnumber += arrCh[nTemp % 11];
      return true;
    }
  }
  if (len == 18) {
    re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
    var arrSplit = personnumber.match(re);

    //检查生日日期是否正确
    var dtmBirth = new Date(arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
    var bGoodDay;
    bGoodDay =
      dtmBirth.getFullYear() == Number(arrSplit[2]) &&
      dtmBirth.getMonth() + 1 == Number(arrSplit[3]) &&
      dtmBirth.getDate() == Number(arrSplit[4]);
    if (!bGoodDay) {
      return false;
    } else {
      //检验18位身份证的校验码是否正确。
      //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
      var valnum;
      var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
      var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
      var nTemp = 0,
        i;
      for (i = 0; i < 17; i++) {
        nTemp += personnumber.substr(i, 1) * arrInt[i];
      }
      valnum = arrCh[nTemp % 11];
      if (valnum != personnumber.substr(17, 1)) {
        return false;
      }
      return true;
    }
  }
  return false;
}
